﻿namespace GoFun.Tests

open NUnit.Framework
open FsCheck
open GoFun.Lib

[<TestFixture>]
type ``Die Freiheiten eines Steins``() = 
    
    [<Test>]
    member test.``in der Ecke des Felds ohne angrenzende Steine ist 2``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['B'; '_'; '_'];
              ['_'; '_'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (0,0)
        Assert.AreEqual(2, freiheiten)

    [<Test>]
    member test.``in der Ecke des Felds mit einem angrenzende Stein ist 1``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['B'; 'w'; '_'];
              ['_'; '_'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (0,0)
        Assert.AreEqual(1, freiheiten)

    [<Test>]
    member test.``in der Ecke des Felds mit einem angrenzende und einem diagonal angrenzenden Stein ist 1``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['B'; 'w'; '_'];
              ['_'; 'w'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (0,0)
        Assert.AreEqual(1, freiheiten)

    [<Test>]
    member test.``in der Ecke des Felds mit zwei angrenzenden Steinen ist 0``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['B'; 'w'; '_'];
              ['w'; '_'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (0,0)
        Assert.AreEqual(0, freiheiten)

    [<Test>]
    member test.``am Rand des Felds ohne angrenzende Steine ist 3``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; '_'; '_'];
              ['B'; '_'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,0)
        Assert.AreEqual(3, freiheiten)

    [<Test>]
    member test.``am Rand des Felds mit einem angrenzenden Steine ist 2``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; '_'; '_'];
              ['B'; 'w'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,0)
        Assert.AreEqual(2, freiheiten)

    [<Test>]
    member test.``am Rand des Felds mit zwei angrenzenden Steinen ist 1``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['w'; '_'; '_'];
              ['B'; 'w'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,0)
        Assert.AreEqual(1, freiheiten)

    [<Test>]
    member test.``am Rand des Felds mit drei angrenzenden Steinen ist 0``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['w'; '_'; '_'];
              ['B'; 'w'; '_'];
              ['w'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,0)
        Assert.AreEqual(0, freiheiten)

    [<Test>]
    member test.``innerhalb des Felds ohne angrenzende Steine ist 4``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; '_'; '_'];
              ['_'; 'B'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,1)
        Assert.AreEqual(4, freiheiten)    

    [<Test>]
    member test.``innerhalb des Felds mit einem angrenzenden Stein ist 3``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; 'w'; '_'];
              ['_'; 'B'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,1)
        Assert.AreEqual(3, freiheiten)    

    [<Test>]
    member test.``innerhalb des Felds mit zwei angrenzenden Steinen ist 2``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; 'w'; '_'];
              ['w'; 'B'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,1)
        Assert.AreEqual(2, freiheiten)    

    [<Test>]
    member test.``innerhalb des Felds mit drei angrenzenden Steinen ist 1``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; 'w'; '_'];
              ['w'; 'B'; '_'];
              ['_'; 'w'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,1)
        Assert.AreEqual(1, freiheiten)    

    [<Test>]
    member test.``innerhalb des Felds mit vier angrenzenden Steinen ist 0``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; 'w'; '_'];
              ['w'; 'B'; 'w'];
              ['_'; 'w'; '_'];
            ] |> parseBrett
        let freiheiten = Freiheiten.fürSteinAuf brett (1,1)
        Assert.AreEqual(0, freiheiten)    